home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / pbmplus / pbm / libpbm2.c < prev    next >
Text File  |  1996-02-28  |  3KB  |  134 lines

  1. /* libpbm2.c - pbm utility library part 2
  2. **
  3. ** Copyright (C) 1988 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include "pbm.h"
  14. #include "libpbm.h"
  15.  
  16. static bit
  17. pbm_getbit( file )
  18.     FILE* file;
  19.     {
  20.     register char ch;
  21.  
  22.     do
  23.     {
  24.     ch = pbm_getc( file );
  25.     }
  26.     while ( ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' );
  27.  
  28.     if ( ch != '0' && ch != '1' )
  29.     pm_error( "junk in file where bits should be" );
  30.  
  31.     return ( ch == '1' ) ? 1 : 0;
  32.     }
  33.  
  34. int
  35. pbm_readmagicnumber( file )
  36.     FILE* file;
  37.     {
  38.     int ich1, ich2;
  39.  
  40.     ich1 = getc( file );
  41.     if ( ich1 == EOF )
  42.     pm_error( "EOF / read error reading magic number" );
  43.     ich2 = getc( file );
  44.     if ( ich2 == EOF )
  45.     pm_error( "EOF / read error reading magic number" );
  46.     return ich1 * 256 + ich2;
  47.     }
  48.  
  49. void
  50. pbm_readpbminitrest( file, colsP, rowsP )
  51.     FILE* file;
  52.     int* colsP;
  53.     int* rowsP;
  54.     {
  55.     /* Read size. */
  56.     *colsP = pbm_getint( file );
  57.     *rowsP = pbm_getint( file );
  58.     }
  59.  
  60. void
  61. pbm_readpbminit( file, colsP, rowsP, formatP )
  62.     FILE* file;
  63.     int* colsP;
  64.     int* rowsP;
  65.     int* formatP;
  66.     {
  67.     /* Check magic number. */
  68.     *formatP = pbm_readmagicnumber( file );
  69.     switch ( PBM_FORMAT_TYPE(*formatP) )
  70.     {
  71.         case PBM_TYPE:
  72.     pbm_readpbminitrest( file, colsP, rowsP );
  73.     break;
  74.  
  75.     default:
  76.     pm_error( "bad magic number - not a pbm file" );
  77.     }
  78.     }
  79.  
  80. void
  81. pbm_readpbmrow( file, bitrow, cols, format )
  82.     FILE* file;
  83.     bit* bitrow;
  84.     int cols, format;
  85.     {
  86.     register int col, bitshift;
  87.     register unsigned char item;
  88.     register bit* bP;
  89.  
  90.     switch ( format )
  91.     {
  92.     case PBM_FORMAT:
  93.     for ( col = 0, bP = bitrow; col < cols; ++col, ++bP )
  94.         *bP = pbm_getbit( file );
  95.     break;
  96.  
  97.     case RPBM_FORMAT:
  98.     bitshift = -1;
  99.     for ( col = 0, bP = bitrow; col < cols; ++col, ++bP )
  100.         {
  101.         if ( bitshift == -1 )
  102.         {
  103.         item = pbm_getrawbyte( file );
  104.         bitshift = 7;
  105.         }
  106.         *bP = ( item >> bitshift ) & 1;
  107.         --bitshift;
  108.         }
  109.     break;
  110.  
  111.     default:
  112.     pm_error( "can't happen" );
  113.     }
  114.     }
  115.  
  116. bit**
  117. pbm_readpbm( file, colsP, rowsP )
  118.     FILE* file;
  119.     int* colsP;
  120.     int* rowsP;
  121.     {
  122.     register bit** bits;
  123.     int format, row;
  124.  
  125.     pbm_readpbminit( file, colsP, rowsP, &format );
  126.  
  127.     bits = pbm_allocarray( *colsP, *rowsP );
  128.  
  129.     for ( row = 0; row < *rowsP; ++row )
  130.     pbm_readpbmrow( file, bits[row], *colsP, format );
  131.  
  132.     return bits;
  133.     }
  134.